/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador.analisadorLexico.automatos;

import compilador.analisadorLexico.Alfabeto;
import compilador.analisadorLexico.CodeReader;
import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorLexico.TokenErro;

/**
 *
 * @author Henrique
 */
public class AutomatoCharConst implements IAutomato{
    
    private CodeReader reader;
    
    public AutomatoCharConst(CodeReader reader) {
        this.reader = reader;
    }
    
    public Token extraiToken() {
        reader.clear();
        
        int linha = reader.getCurrentLine();
        
        boolean ehValido = true;
        boolean eof = false;
        
        char caractere = reader.next();
        char caracterInvalido = 0;
                
        
        if(Alfabeto.ehAspa(caractere)){
            
            do{
                caractere = reader.next();
                
                if(Alfabeto.ehAspa(caractere)){
                    break;
                    
                }else if(caractere == CodeReader.EOF){
                    eof = true;
                    break;
                    
                }else if(Alfabeto.ehValido(caractere)){
                    // continua
                }else{
                    caracterInvalido = caractere;
                    ehValido = false;
                }
                
            }while(true);
            
        } else {
            //se não começa com aspa
            return null;
        }
            
        
        Token token = null;
        reader.next();
        String lexema = reader.closeToken();
        
        if(eof == false){
            lexema = lexema.replaceAll("'", ""); //remover aspas
            
            if(ehValido){
                token =  new Token(TokenClass.CHARCONST, lexema, linha);
            } else {
                token =  new TokenErro(lexema, linha, "" + caracterInvalido + ": Caracter inválido");
            }
        
        }else{
            token =  new TokenErro(lexema, linha, "CharConst não foi fechado");
        }

        return token;
    }

}
